16進数と逝く、MIDIファイルの中身について 第4夜
前回:16進数と逝く、MIDIファイルの中身について 第3夜
いやさ、花粉症やばいって、まじで、昼外出たんだけど今でも鼻水出てきたよ、ちょっと前に神社に花粉が出ない木があったとか聞いたけど、商品用の木はともかく、街路樹はすべてそれにするべき、まじで、
で、前回の続きとして、
SysEx(F0) かメタイベント(FF)の読み方
ABがない場合←ABってなにそれってなった人は前回記事を読もうね
を解説します
SysExについてですが、これはメーカー独自の信号などを送ったりするもので、ハードウェアシンセに入力する信号に見られます、(VSTiとかのソフトウェアシンセの場合、ソフトの方で全部いじれちゃうから独自信号の送信とかいらないんだよね)
これはF0で始まり、F7で終わります、いままでのデータの長さがかっちりと決まっていたり、事前に長さが指定されているものとは違い、データの中でF7が使えませんね
メタイベントについてですが、これは再生には関係ないので、再生だけしたいよって場合は読み飛ばして構いません、しかし、中のデータの中身が可変長であることに注意してください、これから解説します
メタイベントはFFで始まり、テキストを表示したり、トラックの名前を表記する場合に使用されますMIDIのくせになまえきだな
FFの次はXX YY... ZZ...(実際のデータじゃないよ)のようになっています
XXの部分はメタイベントの種類を表しています、種類一覧の表はこれ
table:表
XXの中身 種類 概要
00 シーケンス番号 フォーマット2の場合、ここのデータでパターンを認識することがあるらしい、あとデータのバイト数が絶対2
01 テキスト ASCII文字、テキストを記述するときに使う、いわゆるコメント
02 著作権表示 ASCII文字、イベントの一番最初とするようだが、見たことがないゾ
03 トラック名 ASCII文字
04 楽器名 ASCII文字
05 歌詞 ASCII文字、そのタイミングで任意の文字列を表示することができる
06 マーカ ASCII文字、フォーマット0か1の最初のトラックで使用されるようだ
07 キューポイント ASCII文字、動画などに指示を出すようだ
20 MIDIチャンネルプリフィクス データのバイト数が絶対2
2F エンドオブトラック データのバイト数が絶対0
51 セットテンポ データのバイト数が絶対3、4分音符の長さをマイクロ秒で記述
54 SMPTEオフセット データのバイト数が絶対5
58 拍子/メトロノーム設定 データのバイト数が絶対4、AA BB CC DD のように分解したとき、AAは分母、BBはlog(分母,2)、CCは1拍あたりのクロック数、DDは4分音符に32分音符が何個入るかを表しています
59 調号 データのバイト数が必ず2、AA BB のように分解した場合、AAはシャープ(フラット)の数、1ビット目が0の場合シャープの個数、1の場合はフラットの個数を次の7bitで表す、BBは00のときは長調、01のときは単調になります
7F シーケンサ固有メタイベント さっきもあったよねコレ、だけどデータの1バイト目には登録済みのメーカーIDが入るから、こっちは登録してるメーカーしか使えないんだ、メーカーIDとメーカー名は割愛するぞ
これら以外 ?? 未定義だが、データのバイト数を参照して読み飛ばせばよい
YY...の部分は可変長のZZ...のバイト数があります、可変長については前回記事を参照してください
/tcom/maeniyondana.icon「この形式前にも読んだなぁ」
ZZ...はデータです
ABがない場合の検出方法と処理方法
イベントの種類を表す1バイトは実は全て1ビット目が1
データ1を表す1バイトの1ビット目は0
ということで、イベントの種類を読もうとして1ビット目が0の場合はこの場合ということになります
ない場合は、イベントの種類が前回と同じということです、例として和音を表すときに使われますね
ちなみに、これは1つ目のイベントとしてはもちろん、SysExやメタイベントに対しても使用できないようです、なんでだろうね
ということを踏まえて、イベントを読んでみましょう
トラックのはじめから適当に取ってきたので、これを見ながら読みましょう
00 FF 58 04 04 02 18 08 00 FF 51 03 05 8C 74 00 90 18 60 83 60 80 18 00
00これは前のイベントから待つデルタタイム数ですね、1ビット目が0なのでここでおわり、0デルタタイム待つ
FFメタイベントが始まるということですね
58拍子/メトロノーム設定のようです
04ちゃんと4バイトですね
04 02 18 08
04=4分の2^`02=4拍子
181拍あたりのクロック数、基本的にこの値をみんな使ってるみたいですよ
084分音符中の32部音符の数、そりゃこの数だ
わかりやすいようにイベントごとに箇条書きを解除した改行を入れておきますね`
000デルタタイム待とう
FFまたメタイベントの開始です
51テンポ指定ですね
03ちゃんと3バイトです
05 8C 74
4分音符1つが363636マイクロ秒、普通の秒に治すと0.363636 ≒ 11/4、BPMにすると60/(11/4)=165
見覚えがある人はあるのではないでしょうか、これはぞねのBPMですね
000デルタタイム待とう
909はノーツオン信号という意味、データの長さは2バイトだ、0はチャンネル番号
18 60
18=24 ドじゃ!!!!!!
60=96 ペシロティ、Reaperで適当にノーツ入力するとこうなるよね
83=2進数で100000111ビット目が1なので次の1バイトも読む
60=2進数で011000001バイト目が0なのでここでおわり、2進数00000111100000=480デルタ待つ、前回記事によりこのMIDIファイルは960デルタ=4分音符ということが判明しているため、これは4分音符の半分=8分音符分待つということになる
808はノーツオフ信号という意味、データの長さは2バイト、0はチャンネル番号
18 00
18=24 ドですね、さっきノーツオン信号を出したやつを止めています
00ノーツオフの場合のペシロティは普通0という話でしたよね
この後もこのように読んでいけばOKです
いや〜〜〜〜〜大変でした、自分でPythonで動作するクソ軽MIDIプレイヤー(レンダー)を作ろうとして既存ライブラリ使ったら思いやろな、、、せやw自分でバイナリ読んだろwってなったらこうなりました
前回の最後であと2夜かかるとか言ってましたが、今夜で終わる事ができました、実はネタ切れ
次夜何やろうかな、フーリエ変換でもやろうかな笑笑
ちなみに書き終わった時間はこんな感じ
https://scrapbox.io/files/65eded32a160e10025a02fdb.png
じゃあの
次回記事:yt-dlpと逝く、推しの動画全部保存しよう大作戦 第5夜
#ゆめにっき